package bsh.meta;

import java.util.List;

import org.objectweb.asm.MethodVisitor;

import bsh.CompilationState;

/**
 * Equivalente ao Method
 * 
 * @author takeshi
 */
public interface MethodDescriptor {

    /**
     * @return {@link TypeWrapper} o tipo que declara este metodo
     */
    TypeWrapper declaringType();

    /**
     * @return o tipo de retorno no metodo
     */
    TypeWrapper returnType();

    /**
     * @return o nome do metodo
     */
    String methodName();

    /**
     * @return list de parametros
     */
    List<? extends TypeWrapper> parameterTypes();

    /**
     * @return list de excecoes
     */
    List<? extends TypeWrapper> throwsClauses();

    /**
     * @return string
     */
    String toDescription();

    /**
     * @return int
     */
    int modifiers();

    /**
     * Drena os argumentos do stack e, opcionalmente, o call target, verificando os tipos e finalmente escrevendo o bytecode para invocar o
     * metodo.
     * 
     * @param visitor {@link MethodVisitor}
     * @param state {@link CompilationState}
     */
    void writeInvoke(MethodVisitor visitor, CompilationState state);

    /**
     * @return boolean
     */
    boolean isVarArgs();

    /**
     * @return <code>true</code> if this method is static
     */
    boolean isStatic();

}
